package icu.thatyear.main.satoken.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaMode;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.BCrypt;
import icu.thatyear.main.entity.TzSysUser;
import icu.thatyear.main.satoken.vo.UserVO;
import icu.thatyear.main.service.ITzSysUserService;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * sa-token用户控制层
 *
 * @author huahua
 * @DATE 2024/8/23
 **/
@RestController
@RequestMapping("/user/")
public class UserController {


    private final RedisTemplate<String,Object> redisTemplate;
    private final ITzSysUserService sysUserService;

    @Autowired
    public UserController(RedisTemplate<String, Object> redisTemplate, ITzSysUserService sysUserService) {
        this.redisTemplate = redisTemplate;
        this.sysUserService = sysUserService;
    }


    @PostMapping("doLogin")
    public SaResult doLogin(@RequestBody UserVO user) {



        if (BeanUtil.isEmpty(user)){
            return SaResult.error("验证码为空");
        }
        //获取redis中的验证码并判断是否有效
        String uuid = (String) redisTemplate.opsForValue().get(user.getUuid());
        if (uuid== null || uuid.isEmpty()){
            return SaResult.error("验证码已过期");
        }
        if (!uuid.equals(user.getCode())){
            return SaResult.error("验证码错误");
        }

        //获取用户
        TzSysUser sysUser = sysUserService.getByUserName(user.getUsername());

        //判断密码是否正确
        if (sysUser == null){
            return SaResult.error("用户名或密码错误");
        }else {
            String password = sysUser.getPassword();
            boolean check = BCrypt.checkpw(user.getPassword(), password);
            if (!check) {
                return SaResult.error("用户名或密码错误");
            }
            StpUtil.login(sysUser.getUserId());
            return SaResult.ok("登录成功");
        }




    }

    // 查询登录状态，浏览器访问： http://localhost:8086/user/isLogin
    @RequestMapping("isLogin")
    public SaResult isLogin() {
        return SaResult.ok("是否登录：" + StpUtil.isLogin());
    }

    /**
     * 查询用户信息接口，需要具备自定义的‘user-query’权限
     *
     * @return SaResult 操作结果，返回成功状态
     */
    @SaCheckPermission("user-read")
    @GetMapping("findUsers")
    public SaResult findUsers() {
        return SaResult.ok();
    }

    /**
     * 创建用户的接口，需具备‘user-write’或'write'权限之一
     * SaMode.AND, 标注一组权限，会话必须全部具有才可通过校验。
     * SaMode.OR, 标注一组权限，会话只要具有其一即可通过校验。
     *
     * @return SaResult 操作结果，返回成功状态
     */
    @SaCheckPermission(value = {"user-write", "write"}, mode = SaMode.OR)
    @GetMapping("createUser")
    public SaResult createUser() {
        /*
        // 查询权限信息 ，如果当前会话未登录，会返回一个空集合
        List<String> permissionList = StpUtil.getPermissionList();
        System.out.println("当前登录账号拥有的所有权限：" + permissionList);

        // 查询角色信息 ，如果当前会话未登录，会返回一个空集合
        List<String> roleList = StpUtil.getRoleList();
        System.out.println("当前登录账号拥有的所有角色：" + roleList);
        */
        return SaResult.ok();
    }

    /**
     * 删除用户
     * 代表需要拥有角色 admin 才可以操作
     *
     * @return SaResult 操作结果，返回成功状态
     */
    @SaCheckRole("admin")
    @GetMapping("/deleteUser")
    public SaResult deleteUser(){
        return SaResult.ok();
    }
}
